﻿#define _CRT_SECURE_NO_WARNINGS 1

// 原题连接：
/*
题目描述
今年是国际数学联盟确定的“2000——世界数学年”，又恰逢我国著名数学家华罗庚先生诞辰 90 周年。在华罗庚先生的家乡江苏金坛，组织了一场别开生面的数学智力竞赛的活动，你的一个好朋友 XZ 也有幸得以参加。活动中，主持人给所有参加活动的选手出了这样一道题目：

设有一个长度为
�
N 的数字串，要求选手使用
�
K 个乘号将它分成
�
+
1
K+1 个部分，找出一种分法，使得这
�
+
1
K+1 个部分的乘积能够为最大。

同时，为了帮助选手能够正确理解题意，主持人还举了如下的一个例子：

有一个数字串：
312
312，当
�
=
3
,
�
=
1
N=3,K=1 时会有以下两种分法：

3
×
12
=
36
3×12=36
31
×
2
=
62
31×2=62
这时，符合题目要求的结果是：
31
×
2
=
62
31×2=62。

现在，请你帮助你的好朋友 XZ 设计一个程序，求得正确的答案。

输入格式
程序的输入共有两行：

第一行共有
2
2 个自然数
�
,
�
N,K。

第二行是一个长度为
�
N 的数字串。

输出格式
结果显示在屏幕上，相对于输入，应输出所求得的最大乘积（一个自然数）。

*/

#include <iostream>
#include <vector>
#include <string>

#include <algorithm>
using namespace std;

// 高精度乘法
string multiply(string num1, string num2) {
    // 各种特判
    if (num1.size() == 0) {
        return num2;
    }
    if (num2.size() == 0) {
        return num1;
    }
    if ("0" == num1 || "0" == num2) {
        return "0";
    }
    if ("1" == num1) {
        return num2;
    }
    if ("1" == num2) {
        return num1;
    }

    int n = num1.size(), m = num2.size();
    // 先将两个字符串进行逆序
    reverse(num1.begin(), num1.end());
    reverse(num2.begin(), num2.end());
    vector<int> temp(n + m - 1);
    string ret;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            temp[i + j] += (num1[i] - '0') * (num2[j] - '0');
        }
    }
    // 处理进位
    int cur = 0, t = 0;
    while (cur < n + m - 1 || t != 0) {
        if (cur < n + m - 1) {
            t += temp[cur++];
        }
        ret += t % 10 + '0';
        t /= 10;
    }
    // 处理前导零
    while (ret.size() > 1 && ret.back() == '0') {
        ret.pop_back();
    }
    reverse(ret.begin(), ret.end()); // 反转
    return ret;
}

// 比较
string maxs(string& s1, string& s2) {
    if (s1.size() != s2.size()) {
        return s1.size() > s2.size() ? s1 : s2;
    }
    return s1 > s2 ? s1 : s2;
}

int main() {
    int N = 0, K = 0;
    cin >> N >> K;
        string str;
        cin >> str;
        // 预处理
        str = " " + str;

        // 创建dp表
        vector<vector<string>> dp(N + 1, vector<string>(K + 1));
        // dp[i][j]表示前i个字符中有j个乘号的情况下的最大乘积

        // 初始化
        dp[1][0] = to_string(str[1] - '0');

        // 填表
        for (int j = 0; j <= K; j++) {
            for (int i = j + 1; i <= N; i++) { // 因为要合法分割，所以字符的长度最少比乘号多1
                for (int k = i - 1; k >= (j - 1) + 1; k--) {
                    string temp = str.substr(k + 1, i - k); // 取出最后要累乘的数字串
                    if (temp[0] == '0' && temp.back() == '0') {
                        temp = "0";
                    }
                    string ret = multiply(temp, dp[k][max(0, j - 1)]);
                    dp[i][j] = maxs(ret, dp[i][j]);
                }
            }
        }
        cout << dp[N][K] << endl;
    
    return 0;
}







